package main

import "fmt"

// ==========defer延时机制==========
// 在函数中, 程序员经常需要创建资源(比如: 数据库连接、文件句柄、锁等),
// 为了在函数执行完毕后, 及时的释放资源, Go的设计者提供defer(延时机制)

func sum(n1, n2 int) int {

	// 当执行到defer时, 暂时不执行, 会将defer后面的语句压入到独立的栈中
	// 当函数执行完毕后, 按照先入后出的方式出栈, 然后执行, 谁先进去, 后被执行
	defer fmt.Println("n1 =", n1)
	defer fmt.Println("n2 =", n2)
	res := n1 + n2
	fmt.Println("res =", res)
	return res
}

func sum2(n1, n2 int) int {
	defer fmt.Println("~n1 =", n1) // 第三个执行
	defer fmt.Println("~n2 =", n2) // 第二个执行
	n1++                           // n1++并不会影响已经被压入栈的n1, 所以结果还是10
	n2++                           // n2++并不会影响已经被压入栈的n2, 所以结果还是20
	res := n1 + n2
	fmt.Println("~res =", res) // 第一个执行
	return res
}

func main() {
	fmt.Println(sum(1, 2))
	// 打印顺序
	// res = 3
	// n2 = 2
	// n1 = 1
	// 3

	fmt.Println(sum2(10, 20))
	// 打印顺序
	// ~res = 32
	// ~n2 = 20
	// ~n1 = 10
	// 32

}
